#include <memory>
#include <utility>
#include <vector>
#include <iostream>
#include <variant>

class FrontEndDeveloper {
	public:
	void develop() {
		developFrontEnd();
	}

	private:
	void developFrontEnd() {
		std::cout << "Front End developing" << std::endl;
	}
};

class BackEndDeveloper {
	public:
	void develop() {
		developBackEnd();
	}

	private:
	void developBackEnd() {
		std::cout << "Back End developing" << std::endl;
	}
};


template <typename... Devs>
class Project {
	public:
	using Ds = std::vector<std::variant<Devs...>>;

	explicit Project(Ds developers) : developers_{std::move(developers)}
	{}

	void deliver() {
		for (auto &developer: developers_) {
			std::visit([](auto &dev) {
				dev.develop();
			},
			developer
			);
		}
	}

	private:
		Ds developers_;
};


using MyProject = Project<FrontEndDeveloper, BackEndDeveloper>;

int main() {
	auto alice = FrontEndDeveloper{};
	auto bob = BackEndDeveloper{};
	auto new_project = MyProject{{alice, bob}};
	new_project.deliver();

	return 0;
}
